package com.llbnk.srb.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.llbnk.srb.oss.service.FileService;
import com.llbnk.srb.oss.util.OssProperties;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.util.UUID;

/**
 * 业务层Service层上传文件
 * 首先，进行了创建OSSClient实例，判断阿里云中的OSS中Bucket是否存在，如果不存在就创建一个Bucket
 * 如果存在，执行上传就需要考虑key怎么写，整个文件在服务器上的路径module，timeFolder，fileName组成
 * @author shkstart
 * @create 2022-04-12 19:05
 */
@Service
public class FileServiceImpl implements FileService {

    @Override
    public String upload(InputStream inputStream, String module, String fileName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(
                OssProperties.ENDPOINT,
                OssProperties.KEY_ID,
                OssProperties.KEY_SECRET);

        //// 判断存储空间examplebucket是否存在。如果返回值为true，则存储空间存在，如果返回值为false，则存储空间不存在。
        if(!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)){
            // 创建存储空间。
            ossClient.createBucket(OssProperties.BUCKET_NAME);
            // 设置存储空间的读写权限。例如将examplebucket的读写权限ACL设置为私有Private。
            //一共三种访问权限  私有：CannedAccessControlList.Private
            //       公共读：CannedAccessControlList.PublicRead
            //     公共读写：CannedAccessControlList.PublicReadWrite
            ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedAccessControlList.PublicRead);
        }

            // 创建PutObject请求。
            //构建日期路径
        String timeFolder = new DateTime().toString("/yyyy/MM/dd/");
        //随机数字符串拼接文件的后缀 比如：photo.jpg
        // fileName.substring(fileName.lastIndexOf("."))就是取jpg文件后缀
        fileName=UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
        //文件目录结构"avatar/2022/04/12/uuid(随机数)"
        String key = module+timeFolder+fileName;
            ossClient.putObject(OssProperties.BUCKET_NAME, key, inputStream);

                ossClient.shutdown();

                //上传上去文件 一定提供给用于下载的
                //在阿里云Bucket包中的文件都会在详情中生成一个url
        //https://srb-flie-srbk.oss-cn-beijing.aliyuncs.com/avatar/11.png
            //通过解析发现就是https:// + bucketName + . + endpoint + key
                return "https://" +OssProperties.BUCKET_NAME+"."+OssProperties.ENDPOINT+"/"+key;//文件的url
    }


    /**
     * 通过截断从url中提取文件名，ossClient.deleteObject方法删除阿里云OSS中对应url的文件
     * @param url 完整的url地址 需要在removeFile自动通过url找到文件名
     */
    @Override
    public void removeFile(String url) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(
                OssProperties.ENDPOINT,
                OssProperties.KEY_ID,
                OssProperties.KEY_SECRET);

            //需要从url中提炼文件名 所以就需要用到截断方法
        //https://srb-flie-srbk.oss-cn-beijing.aliyuncs.com/被截掉的
        //test/2022/04/12/11.jpg 留下来的
        String host="https://"+ OssProperties.BUCKET_NAME+"."+OssProperties.ENDPOINT+"/";
        String objectName=url.substring(host.length());
            ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);

                ossClient.shutdown();

    }
}
